package utils

import (
	"fmt"
	"log"
	"strconv"
	"time"

	"github.com/dgrijalva/jwt-go"
)

// 定义全局变量存储密钥
var secret []byte

// 初始化函数，在包加载时读取环境变量
// func init() {
// 	err := godotenv.Load()
// 	if err != nil {
// 		log.Fatal("Error loading .env file")
// 	}

// 	secretStr := os.Getenv("JWT_SECRET")
// 	if secretStr == "" {
// 		log.Fatal("SECRET_KEY is not set in the environment")
// 	}
// 	secret = []byte(secretStr)
// }

// CreateJwt 创建JWT
func CreateJwt(userId string, hours uint) (string, error) {
	// 设置JWT的过期时间
	expirationTime := time.Now().Add(time.Duration(hours) * time.Hour)

	// 创建JWT的声明
	claims := &jwt.StandardClaims{
		ExpiresAt: expirationTime.Unix(),
		Subject:   userId,
	}

	// 使用HS256算法生成签名
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

	// 签名并返回Token
	tokenString, err := token.SignedString(secret)
	if err != nil {
		return "", err
	}

	return tokenString, nil
}

// ValidateJwt 验证JWT
func ValidateJwt(tokenString string) int {
	// 解析JWT
	claims := &jwt.StandardClaims{}
	token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
		return secret, nil // 使用全局变量中的密钥
	})

	if err != nil {
		return 0
	}

	if !token.Valid {
		fmt.Println(jwt.ErrSignatureInvalid)
		return 0
	}

	// 将 claims.Subject 转换为整数
	userId, err := strconv.Atoi(claims.Subject)
	if err != nil || userId < 0 {
		log.Println("Invalid user ID:", claims.Subject)
		return 0
	}

	// 返回用户ID和过期时间
	//判断是否已经过期
	//如果过期返回-1
	if time.Now().Unix() > claims.ExpiresAt {
		return -1
	}
	return int(userId)
}
